<template>
  <div class="loginpage"> 
    <div class="content">
        <h2>商城App后管理系统</h2>
        <!-- 引用element的单个控件，使用原生form表单 -->
        <el-form :model="loginObj" :rules="loginRules" ref="ruleFormRef">
            <!-- prop="uname"绑定的是验证规则 -->
            <el-form-item label="UserName:" class="item_label" prop="uname">
                <el-input placeholder="请输入邮箱/手机号码登录" class="item_input" v-model.lazy.trim="loginObj.uname"/>
            </el-form-item>

              <el-form-item label="PassWord:" class="item_label"  prop="upwd">
                <el-input placeholder="请输入登录密码" show-password class="item_input" v-model.lazy.trim="loginObj.upwd" />
            </el-form-item>
            
            <el-form-item prop="isAgree">
                <el-checkbox v-model="loginObj.isAgree">已阅读并同意《服务条款》</el-checkbox>
            </el-form-item>

            <el-form-item>
                <!-- el-button -->
                <el-button type="primary" color="darkcyan" class="texcol" @click="onLogin(ruleFormRef)">登录</el-button>
            </el-form-item>
        </el-form>
    </div>
  </div>
</template>

<script setup>
import {  reactive, ref } from "vue";
import { ElMessage } from "element-plus";
import {md5} from 'js-md5';

import $axios from "../../utils/request";
import router from "../../router";

// 组件创建完成后，自动捕获表单的DOM对象
const ruleFormRef = ref('');
// 表单数据绑定对象
let loginObj= reactive({
    uname:'',
    upwd : '',
    isAgree : false,
});

// 自定义验证的复选框
const RuleAgreen =(rule,value,callback)=>{
    // 如果没有勾选复选框，
    if(!value ){
        callback( new Error('必须勾选该项！'));
    }else{
        callback();
    }
}

// 验证规则对象
const loginRules = reactive({
    // 针对第一个账号输入框进行失去焦点时，非空验证
    uname : [
        {required:true , message:'必须填写登录账号！', trigger: 'blur'}
    ],
    upwd:[
        {required:true ,message:'必须填写密码' ,trigger:'blur'}
    ],
    isAgree:[
        // 自定义验证规则，那么必须保证自定义验证函数在规则对象之前创建
        { validator: RuleAgreen ,trigger:'change' }
    ]
})

// 提交表单
const onLogin =(formEl)=>{
    // 提取rules的验证规则结果
    //此写法适用于非setu结构/ vue2写法  this.$ref[formEl].validate((val)=>{
    formEl.validate((val)=>{
        if(val){
        // 整合需要提交给后端的数据
        let data = {
            // 整合需要提交给后端的数据
                username : loginObj.uname,
                password : md5(loginObj.upwd)
            }
            // 向登录接口发起请求
            $axios.post('/login' ,data).then( (res)=>{
                if (res.code === '200') {
                    router.push('/admin/index');
                    sessionStorage.setItem('user',JSON.stringify(res.data))
                }else{
                    ElMessage.error(res.msg);
                }

            }).catch((error)=>{
               if (error.response == undefined || error.response.data == undefined) {
                    ElMessage.error(error)
               }else{
                ElMessage.error(error.response.data);
               }
            })
        }else{
            ElMessage.error('登录失败，请重新登录!')
            return false;
        }
     
    })
}
</script>

<style scoped>
.loginpage{
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background-color: #2a2a2a;
    position: relative;
}
.loginpage .content{
    width: 400px;
    background-color: rgba(255, 255, 255, 0.8);
    box-shadow: 0px 0px 8px white;
    border-radius: 10px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
.loginpage .content h2{
    color: #008b8b;
    line-height: 80px;
    text-align: center;
    font-size: 24px;
    font-family: "黑体";
}
/* 当使用第三方UI框架时需要修改样式的情况，观察浏览器的最终组件效果 */
/* 情况1:结构比较简单,组件直接生成对应的标签,如el-form直接生成form标签的情况 ,可以直接对标签进行修改*/
.loginpage .content form{
    width: 90%;
    margin: 0 auto;
}
.loginpage .content button{
    width: 100%;
}
/* ：deep()：穿刺(存在兼容性问题，移动端不显示) */
.loginpage .content :deep(button>span){
    color: white;
}
/* 情况1:结构比较复杂,组件生成多层结构,如el-form- item生成div+div+laber结构的情况,采用自定义class选择器设置组件上的操作*/
.loginpage .content form .item_label{
    font-weight: 600;
}
.loginpage .content .item_input{
    border: 1px solid gray;
    border-radius: 6px;
    line-height: 40px;
    overflow: hidden;
}
/* 通过自定义类名穿透样式 */
.loginpage :deep(.custom-error-msg) {
  background-color: #fef0f0 !important;
  border-color: #fde2e2;
  
}

  .el-icon.el-message__icon {
    color: #ff4444 !important;
  }

</style>